﻿#define _CRT_SECURE_NO_WARNINGS 1

//#include<stdio.h>
//#include <string.h>
//#include <math.h>

//#include <stdio.h>
//
//int main() {
//    int xue;
//    double s1, s2, s3;
//    scanf("%d;%lf,%lf,%lf", &xue, &s1, &s2, &s3);
//
//    if ((int)((s1 - (int)s1) * 1000) % 10 >= 5)
//        s1 = s1 + .005;
//
//    if ((int)((s2 - (int)s2) * 1000) % 10 >= 5)
//        s2 = s2 + .005;
//
//    if ((int)((s3 - (int)s3) * 1000) % 10 >= 5)
//        s3 = s3 + .005;
//
//    printf("The each subject score of No. %d is %.2f, %.2f, %.2f.", xue, s1, s2, s3);
//    return 0;
//}


//#include <stdio.h>
//
//int main() {
//    char a;
//    while (scanf("%c", &a) != EOF) {
//        if (a >= 'a' && a <= 'z' || a >= 'A' && a <= 'Z') {
//            printf("%c is an alphabet.", a);
//        }
//        else {
//            printf("%c is not an alphabet.", a);
//        }
//    }
//    return 0;
//}

//#include <stdio.h>
//
//int main() {
//    char a;
//    while (scanf("%c", &a) != EOF) {
//        if (a >= 'a' && a <= 'z' || a >= 'A' && a <= 'Z') {
//            printf("%c is an alphabet.", a);
//        }
//        else {
//            printf("%c is not an alphabet.", a);
//        }
//    }
//    return 0;
//}


//int main()
//{
//    int a, b, c, i;
//    int count = 0;
//    for (i = 0; i <= 2019; i++) {
//        a = i % 10;
//        b = i / 10 / 10 % 10;
//        c = i / 10 % 10;
//        if (a == 9 || b == 9 || c == 9) {
//            count++;
//        }
//    }
//    printf("%d\n", count);
//    return 0;
//}

//……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………


//sizeof(数组名)，这⾥的数组名表⽰整个数组，计算的是整个数组的⼤⼩。
//2. & 数组名，这⾥的数组名表⽰整个数组，取出的是整个数组的地址。
//3. 除此之外所有的数组名都表⽰⾸元素的地址

//#include <stdio.h>

//int main()
//{
//
//	int a[] = { 1,2,3,4 };
//	printf("%zd\n", sizeof(a));//16
//	printf("%zd\n", sizeof(a + 0));//4/8
//	printf("%zd\n", sizeof(*a));//4
//	printf("%zd\n", sizeof(a + 1));//4/8
//	printf("%zd\n", sizeof(a[1]));//4
//	printf("%zd\n", sizeof(&a));//4/8
//
//	printf("%zd\n", sizeof(*&a));//4?--->16
//	//&a取出的是整个a数组的地址，*（解引用）是对整个数组解引用，所以计算的是整个数组
//
//	printf("%zd\n", sizeof(&a + 1));//4/8
//	printf("%zd\n", sizeof(&a[0]));//4/8
//	printf("%zd\n", sizeof(&a[0] + 1));//4/8
//	return 0;
//}


//int main()
//{
//	char arr[] = { 'a','b','c','d','e','f' };
//	printf("%zd\n", sizeof(arr));//6
//	printf("%zd\n", sizeof(arr + 0));//4/8
//	printf("%zd\n", sizeof(*arr));//1
//	printf("%zd\n", sizeof(arr[1]));//1
//	printf("%zd\n", sizeof(&arr));//4/8
//	printf("%zd\n", sizeof(&arr + 1));//4/8
//	printf("%zd\n", sizeof(&arr[0] + 1));//4/8
//	
//	return 0;
//}


//int main()
//{
//	char arr[] = { 'a','b','c','d','e','f' };
//	printf("%d\n", strlen(arr));//随机数
//	printf("%d\n", strlen(arr + 0));//随机数
//	//printf("%d\n", strlen(*arr));//错误
//	//printf("%d\n", strlen(arr[1]));//错误
//	printf("%d\n", strlen(&arr));//随机值
//	printf("%d\n", strlen(&arr + 1));//随机值
//	printf("%d\n", strlen(&arr[0] + 1));//随机值
//	
//	return 0;
//}

//int main()
//{
//	char arr[] = "abcdef";//a b c d e f \0
//	printf("%zd\n", sizeof(arr));//7
//	printf("%zd\n", sizeof(arr + 0));//4/8
//	printf("%zd\n", sizeof(*arr));//1
//	printf("%zd\n", sizeof(arr[1]));//1
//	printf("%zd\n", sizeof(&arr));//4/8
//	printf("%zd\n", sizeof(&arr + 1));//4/8
//	printf("%zd\n", sizeof(&arr[0] + 1));//4/8
//	
//	return 0;
//}


//int main()
//{
//	char arr[] = "abcdef";//a b c d e f \0
//	printf("%d\n", strlen(arr));//6
//	printf("%d\n", strlen(arr + 0));//6
//	//printf("%d\n", strlen(*arr));//err
//	//printf("%d\n", strlen(arr[1]));//err
//	printf("%d\n", strlen(&arr));//6
//	printf("%d\n", strlen(&arr + 1));//随机值
//	printf("%d\n", strlen(&arr[0] + 1));//5
//	return 0;
//}


//int main()
//{
//	char* p = "abcdef";//a b c d e f \0  常量字符串
//	//p保存的是a的地址
//	printf("%zd\n", sizeof(p));//4/8
//	printf("%zd\n", sizeof(p + 1));//4/8
//	printf("%zd\n", sizeof(*p));//1
//	printf("%zd\n", sizeof(p[0]));//1
//	printf("%zd\n", sizeof(&p));//4/8
//	printf("%zd\n", sizeof(&p + 1));//4/8
//	printf("%zd\n", sizeof(&p[0] + 1));//4/8
//	
//	return 0;
//}

//
//int main()
//{
//	char* p = "abcdefg";//a b c d e f \0
//	//p保存的是a的地址
//	printf("%d\n", strlen(p));//6
//	printf("%d\n", strlen(p + 1));//5
//	//printf("%d\n", strlen(*p));//err
//	//printf("%d\n", strlen(p[0]));//err
//	printf("%d\n", strlen(&p));//随机值
//	printf("%d\n", strlen(&p + 1));//随机值
//	printf("%d\n", strlen(&p[0] + 1));//5
//	return 0;
//}


//int main()
//{
//	int a[3][4] = { 0 };
//	printf("%zd\n", sizeof(a));//3*4*sizeof(int)--->48
//	printf("%zd\n", sizeof(a[0][0]));//4
//	printf("%zd\n", sizeof(a[0]));//16
//	printf("%zd\n", sizeof(a[0] + 1));//4/8
//	printf("%zd\n", sizeof(*(a[0] + 1)));//4
//	printf("%zd\n", sizeof(a + 1));//a+1是第二行的地址，是地址就是   4/8
//	printf("%zd\n", sizeof(*(a + 1)));//16
//	printf("%zd\n", sizeof(&a[0] + 1));//4/8
//	printf("%zd\n", sizeof(*(&a[0] + 1)));//16
//	printf("%zd\n", sizeof(*a));//16
//	printf("%zd\n", sizeof(a[3]));//16
//	
//	return 0;
//}


//下面开始笔试题
//
//#include <stdio.h>
//int main()
//{
//	int a[5] = { 1, 2, 3, 4, 5 };
//	int* ptr = (int*)(&a + 1);
//	printf("%d,%d", *(a + 1), *(ptr - 1));//2   5
//	return 0;
//}



//在X86环境下
//假设结构体的⼤⼩是20个字节
//程序输出的结果是啥？
//#include <stdio.h>
//struct test
//{
//	int Num;
//	char* pcName;
//	short sDate;
//	char cha[2];
//	short sBa[4];
//}*p = (struct Test*)0x100000;
//
//int main()
//{
//	printf("%p\n", p + 0x1);//*p是指针，指针+1跳过20个字节,p是结构体指针
//	//0x100000+0x0014----->0x100014
//	printf("%p\n", (unsigned long)p + 0x1);//100001
//	printf("%p\n", (unsigned int*)p + 0x1);//0x100004，p是整型指针，+1跳过4个字节
//	return 0;
//}


//#include <stdio.h>
//int main()
//{
//	int a[3][2] = { (0, 1), (2, 3), (4, 5) };//1，3，5，0，0，0
//	int* p;
//	p = a[0];
//	printf("%d", p[0]);//1
//	return 0;
//}


//假设环境是x86环境，程序输出的结果是啥？
//#include <stdio.h>
//int main()
//{
//	int a[5][5];
//	int(*p)[4];
//	p = a;
//	printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);//-4
//	return 0;//10000000 00000000 00000000 00000100  原码
//}            //11111111 11111111 11111111 11111011  反码
           //  //11111111 11111111 11111111 11111100  补码
//%p用来输出指针的值，输出地址符。指针，是一个无符号整数

//#include <stdio.h>
//int main()
//{
//    int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//    int* ptr1 = (int*)(&aa + 1);
//    int* ptr2 = (int*)(*(aa + 1));
//    printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));//10,5
//    return 0;
//}


//#include <stdio.h>
//int main()
//{
//    char* a[] = { "work","at","alibaba" };
//    char** pa = a;
//    pa++;
//    printf("%s\n", *pa);
//    return 0;
//}


//#include <stdio.h>
//int main()
//{
//    char* c[] = { "ENTER","NEW","POINT","FIRST" };
//    char** cp[] = { c + 3,c + 2,c + 1,c };
//    char*** cpp = cp;
//    printf("%s\n", **++cpp);//POINT
//    printf("%s\n", *-- * ++cpp + 3);//ER
//    printf("%s\n", *cpp[-2] + 3);//ST
//    printf("%s\n", cpp[-1][-1] + 1);//EW
//    return 0;
//}

//……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
//#include <stdio.h>
//int main()
//{
//    int n = 10;
//    char* pc = (char*)&n;
//    int* pi = &n;
//
//    printf("%p\n", &n);
//    printf("%p\n", pc);
//    printf("%p\n", pc + 1);
//    printf("%p\n", pi);
//    printf("%p\n", pi + 1);
//    return 0;
//}

//void test1()
//{
//    int n = 10;
//    int m = 20;
//    int* p = &n;
//    *p = 20;//yes
//    p = &m;//yes
//}
 
//void test2()
//{
//    int n = 10;
//    int m = 20;
//    const int* p = &n;
//    *p = 20;//no
//    p = &m;//yes
//}

//void test3()
//{
//    int n = 10;
//    int m = 20;
//    int* const p = &n;
//    *p = 20;//yes
//    p = &m;//no
//}


//int main()
//{
//    test3();
//
//    return 0;
//}

//………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
//模拟实现strlen函数
//#include <stdio.h>
////计算器形式
//int my_strlen1(char* s)
//{
//    int count = 0;
//    while (*s != '\0') {
//        count++;
//        s++;
//    }
//    return count;
//}
////指针-指针
//int my_strlen2(char* s)
//{
//    char* p = s;
//    while (*p != '\0')
//        p++;
//    return p - s;
//}
////递归方法
//int my_strlen3(char* s) {
//    if (*s == '\0')
//        return 0;
//    return 1 + my_strlen3(s + 1);
//}
//
//int main()
//{
//    char arr[] = "abcdefg";
//    int ret = my_strlen3(arr);
//    printf("%d\n", ret);
//    return 0;
//}

//char * strcpy ( char * destination, const char * source );
//模拟实现strcpy
//#include <stdio.h>
//char* my_strcpy(char* dest, char* start)
//{
//    
//    char* s = dest;
//    while (*dest++ = *start++);
//    return s;
//}
//
//int main()
//{
//    char arr1[30] = "abcdefg";
//    char arr2[] = "world";
//    puts(my_strcpy(arr1, arr2));
//    return 0;
//}


//模拟实现strcat
//#include <stdio.h>
//char* my_strcat(char* dest, char* start)
//{
//    char* s=dest;
//    while (*dest != '\0')
//        dest++;
//    while (*dest++ = *start++);
//    return s;
//}
//
//int main()
//{
//    char arr1[30] = "hello ";
//    char arr2[] = "world";
//   
//    puts(my_strcat(arr1, arr2));
//    return 0;
//}


//计算器的实现
//#include <stdio.h>
//int add(int x, int y) {
//    return x + y;
//}
//int sub(int x, int y)
//{
//    return x - y;
//}
//int mul(int x, int y)
//{
//    return x * y;
//}
//int div(int x, int y)
//{
//    return x / y;
//}
//
//void menu()
//{
//    printf("****************************************\n");
//    printf("*****  1, add     2, sub            ****\n");
//    printf("*****  3, mul     4, div            ****\n");
//    printf("*****  0, exit                      ****\n");
//    printf("****************************************\n");
//}
//int main()
//{
//    int input = 0;
//    
//    int x = 0;
//    int y = 0;
//    int ret = 0;
//    do
//    {
//
//        printf("请输入操作数：>");
//        scanf("%d", &input);
//        if (input >= 1 && input <= 4)
//        {
//            int  (*pf[5])(int x, int y) = { NULL, add,sub,mul,div };//函数指针数组
//            printf("请输入两个整数：");
//            scanf("%d%d", &x, &y);
//            ret = pf[input](x, y);
//            printf("%d\n", ret);
//        }
//        else if (input == 0)
//            printf("退出计算器\n");
//        else
//            printf("输入错误，请重新输入");
//       
//    } while (input);
//
//
//    return 0;
//}
//
//
////太冗杂了
//int main()
//{
//    int input = 0;
//    
//    int x = 0;
//    int y = 0;
//    int ret = 0;
//    do
//    {
//        printf("请输入操作数：>");
//        scanf("%d", &input);
//        switch (input)
//        {
//        case 1:
//            printf("请输入两个整数：");
//            scanf("%d%d", &x, &y);
//            ret = add(x, y);
//            printf("%d\n",ret);
//            break;
//        case 2:
//            printf("请输入两个整数：");
//            scanf("%d%d", &x, &y);
//            ret = sub(x, y);
//            printf("%d\n", ret);
//            break;
//        case 3:
//            printf("请输入两个整数：");
//            scanf("%d%d", &x, &y);
//            ret = mul(x, y);
//            printf("%d\n", ret);
//            break;
//        case 4:
//            printf("请输入两个整数：");
//            scanf("%d%d", &x, &y);
//            ret = div(x, y);
//            printf("%d\n", ret);
//            break;
//        case 0:
//            printf("退出计算器\n");
//            break;
//        default:
//            printf("输入错误，请重新输入：");
//            break;
//        }
//    } while (input);
//
//
//    return 0;
//}

//void calc(int(*pf)(int x, int y))//函数指针
//{
//    int x = 0;
//    int y = 0;
//    int ret = 0;
//    printf("请输入两个整数：");
//    scanf("%d%d", &x, &y);
//    ret = pf(x, y);
//    printf("%d\n", ret);
//}
//
//int main()
//{
//    int input = 0;
//    
//    do
//    {
//        printf("请输入操作数：>");
//        scanf("%d", &input);
//        switch (input)
//        {
//        case 1:
//            calc(add);
//            break;
//        case 2:
//            calc(sub);
//            break;
//        case 3:
//            calc(mul);
//            break;
//        case 4:
//            calc(div);
//            break;
//        case 0:
//            printf("退出计算器\n");
//            break;
//        default:
//            printf("输入错误，请重新输入：");
//            break;
//        }
//    } while (input);
//
//
//    return 0;
//}


//…………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
//使用qsort排序整型数组
//void qsort (void* base, size_t num, size_t size,            int (*compar)(const void*,const void*));
//#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
//int cmp(const void* p1, const void* p2)
//{
//    return *((int*)p1) - *((int*)p2);
//}
//int main()
//{
//    int arr[] = { 1,2,6,5,3,9,8,2,7 };
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    qsort(arr, sz, sizeof(arr[0]),cmp );
//    int i = 0;
//    for (i = 0; i < sz; i++) {
//        printf("%d ", arr[i]);
//    }
//    printf("\n");
//    return 0;
//}

//void qsort (void* base, size_t num, size_t size,            int (*compar)(const void*,const void*));

//#include <stdio.h>
//#include <string.h>
////使用qsort函数排序结构体
//struct stu
//{
//    char name[20];
//    int age;
//};
//void bubble(void* base, size_t sz, size_t size, int (*cmp)(const void* p1, const void* p2));
//
//int by_name(const void* p1, const void* p2)
//{
//    return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
//}
//void print(struct stu s[], int sz)
//{
//    int i = 0;
//    for (i = 0; i < sz; i++) {
//        printf("%s %d\n", s[i].name, s[i].age);
//    }
//}
//int main()
//{
//    struct stu s[3] = { {"zhangsan",24},{"tangcan",19},{"lisi",43} };
//    int sz = sizeof(s) / sizeof(s[0]);
//    //qsort(s, sz, sizeof(s[0]), by_name);
//    bubble(s, sz, sizeof(s[0]), by_name);
//    //打印
//    print(s, sz);
//    return 0;
//}
//
//
////qsort函数模拟实现冒泡排序
////void qsort (void* base, size_t num, size_t size,            int (*compar)(const void*,const void*));
//
//
//int cmp(const void* p1, const void* p2)
//{
//    return *((int*)p1) - *((int*)p2);
//}
//
//void swap(char*s1, char* s2,int n)
//{
//    while (n--)
//    {
//        char s = *s1;
//        *s1 = *s2;
//        *s2 = s;
//        s1++;
//        s2++;
//    }
//}
//void bubble(void* base, size_t sz, size_t size, int (*cmp)(const void* p1, const void* p2))
//{
//    int i = 0;
//    int j = 0;
//    for (i = 0; i < sz - 1; i++) {
//        for (j = 0; j < sz - 1 - i; j++) {
//            //arr[j] > arr[j + 1]
//            if (cmp(((char*)base + j * size) ,((char*)base + (j + 1) * size))>0)
//            {
//                swap((char*)base + j*size , (char*)base + (j + 1)*size,size);
//            }
//        }
//    }
//}
//int main()
//{
//        int arr[] = { 1,2,6,5,3,9,8,2,7 };
//        int sz = sizeof(arr) / sizeof(arr[0]);
//        //qsort(arr, sz, sizeof(arr[0]),cmp );
//        bubble(arr, sz, sizeof(arr[0]), cmp);
//
//        //打印
//        int i = 0;
//        for (i = 0; i < sz; i++) {
//            printf("%d ", arr[i]);
//        }
//        printf("\n");
//        return 0;
//}

//杨氏矩阵
//#include <stdio.h>
//int main()
//{
//    int arr[4][4] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 };
//    int i = 0;
//    int j = 4-1;
//    int key = 0;
//    int t = 0;
//    scanf("%d", &key);
//    while (i <= 3 && j >= 0) {
//        if (arr[i][j] < key)
//            i++;
//        else if (arr[i][j] > key)
//            j--;
//        else
//        {
//            t = 1;
//            break;
//        }
//    }
//    if (t)
//        printf("yes");
//    else
//        printf("no");
//    return 0;
//}

//找单身狗2
//1 2 3 4 5 1 2 3 4 6
#include <stdio.h>
int main()
{
    int arr[] = { 1,1,2,2,3,4,4,5,6,6 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    int ret1 = 0;
    int ret2 = 0;
    int i = 0;
    int t = 0;
    for (i = 0; i < sz; i++) {
        t ^= arr[i];
    }
    for (i = 0; i < 32; i++) {
        if (t & 1 == 1) {
            break;
        }
        t= t >> 1;
    }
    int j = 0;
    for (j = 0; j < sz; j++) {
        if ((arr[j] >> i) & 1 == 1)
        {
            ret1 ^= arr[j];
        }
        else
            ret2 ^= arr[j];
    }
    printf("%d %d\n", ret1, ret2);
}